package com.eos.freeect.common;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;

public class Utilities {

	/**
	 * 读取表单参数
	 * @param name
	 * @return
	 */
	public static String getParameter(String name) {
		return ServletActionContext.getRequest().getParameter(name);
	}
	
    /**
     * 获取用户IP
     * @return String
     */
	public static String getUserIP() {
		return ServletActionContext.getRequest().getRemoteHost();
	}
	
    /**
     * 设置request的属性
     * @param name
     * @param value
     */
	public static void setAttribute(String name, Object value) {
		ActionContext.getContext().getSession().put(name, value);
    }
	/**
	 * 读取request的属性
	 * @param name
	 * @return
	 */
    public static Object getAttribute(String name) {
        return ActionContext.getContext().getSession().get(name);
    }
    /**
     * 获取请求对象
     * @return
     */
    public static HttpServletRequest getRequest() {
        return ServletActionContext.getRequest();
    }
    /**
     * 设置session值
     * @param name
     * @param value
     */
    @SuppressWarnings("unchecked")
	public static void setSession(String name, Object value) {
    	ActionContext ctx = ActionContext.getContext();
    	Map session = ctx.getSession();
    	session.put(name, value);
    }
    /**
     * 获取session值
     * @param name
     * @return
     */
    @SuppressWarnings("unchecked")
	public static Object getSession(String name) {
    	ActionContext ctx = ActionContext.getContext();
    	Map session = ctx.getSession();
    	return session.get(name);
    }	
    
    /**
     * MD5加密
     * @param str
     * @return str
     */   
    public static String getMD5(String srcString)  
    {  
        StringBuffer destString = new StringBuffer();  
        java.security.MessageDigest md = null;  
        try  
        {  
            md = java.security.MessageDigest.getInstance("MD5");  
        }  
        catch (java.security.NoSuchAlgorithmException e)  
        {  
            e.printStackTrace();  
        }  
        md.update(srcString.getBytes());  
        byte[] buf = md.digest();  
        String tempString = null;  
        for (int i = 0; i < buf.length; i++)  
        {  
            tempString = Integer.toHexString(buf[i] & 0xFF);  
            if (tempString.length() == 1)  
            {  
                destString.append("0");
            }  
            destString.append(tempString);  
        }  
        return destString.toString();  
    }
    

    /**
     * Base64加密
     * @param str
     * @return str
     */ 
    public static String encodeToBase64(String srcString)  
    {  
        return (new sun.misc.BASE64Encoder()).encode(srcString.getBytes());  
    }  
      
    /**
     * Base64解密
     * @param str
     * @return str
     */ 
    public static String decodeByBase64(String srcString)  
    {  
        try  
        {  
            return new String((new sun.misc.BASE64Decoder())  
                .decodeBuffer(srcString));  
        }  
        catch (java.io.IOException e)  
        {  
            e.printStackTrace();  
            return null;  
        }  
    }  
    
    /**
     * Bean中对象的复制
     * @param baseForm 参照Bean对象
     * @param objForm 目标Bean对象
     * @throws Exception Exception
     */
    public static void setBeanValue(Object baseForm, Object objForm)
            throws Exception {
        // 取得拷贝对象的所有域
        Field[] fieldsBase = baseForm.getClass().getDeclaredFields();
        Field.setAccessible(fieldsBase, true);
        // 取得目标对象的所有域
        Field[] fieldsObj = objForm.getClass().getDeclaredFields();
        Field.setAccessible(fieldsObj, true);
        for (int i = 0; i < fieldsObj.length; i++) {
            // 取得域名称
            Field fieldObj = fieldsObj[i];
            for (int j = 0; j < fieldsBase.length; j++) {
                Field fieldBase = fieldsBase[j];
                // 比较两域名称是否一致
                if (fieldObj.getName().equals(fieldBase.getName())) {
                    // 取得域名称并将第一个字母大小
                    String fieldName = fieldObj.getName();
                    String firstChar = fieldName.substring(0, 1).toUpperCase();
                    fieldName = firstChar + fieldName.substring(1);
                    // 取得目标对象中的set方法
                    Method methodObj = objForm.getClass().getMethod("set" + fieldName,
                            new Class[] { fieldObj.getType() });
                    // 取得参照对象中的get方法
                    Method methodGet = baseForm.getClass().getMethod("get" + fieldName, null);
                    // 执行参照对象的get方法并取得返回值
                    Object resultObj = methodGet.invoke(baseForm, null);
                    // 执行目标对象的set方法并进行设值
                    methodObj.invoke(objForm, new Object[] { resultObj });
                    break;
                }
            }
        }
    }
    
}
